package myPow;

/**
 * ************************* Pow(x, n)**********************
 * 实现 pow(x, n) ，即计算 x 的整数 n 次幂函数（即，xn ）。
 *
 * 示例 1：
 * 输入：x = 2.00000, n = 10
 * 输出：1024.00000
 *
 * 示例 2：
 * 输入：x = 2.10000, n = 3
 * 输出：9.26100
 *
 * 示例 3：
 * 输入：x = 2.00000, n = -2
 * 输出：0.25000
 * 解释：2-2 = 1/22 = 1/4 = 0.25
 */
public class Solution {
    public static double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n == Integer.MIN_VALUE) {
            n = n + 1;
            x = x * myPow(x, n);
        }
        // 累赘了，转为整数会溢出、无穷大（详见Solution1）
        int m = Math.abs(n);
        if (m > 1) {
            if ((n & 1) == 0) {
                m = m / 2;
                x = myPow(x * x, m);
            } else {
                m = m - 1;
                x = x * myPow(x, m);
            }
        }
        // 转为正数计算代价
        if (n < 0 && Double.POSITIVE_INFINITY == 1/x) {
            return 0;
        }
        return n < 0 ? 1/x : x;
    }

    public static void main(String[] args) {
        System.out.println(Math.pow(2, -2));
        System.out.println(myPow(2, -2));
    }
}
